package com.shop.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import org.apache.commons.lang3.StringUtils;

public class PinyinUtils {

	/**
	 * 获取汉字首字母缩写 
	 * 
	 * @param chinese
	 * @return 例如：微信=wx
	 * @author Wesley.Wei
	 * @date 2015年4月3日 上午9:49:27
	 */
	public static String getFirstSpell(String chinese) {
		StringBuffer pybf = new StringBuffer();
		char[] arr = chinese.toCharArray();
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);

		for (int i = 0; i < arr.length; i++) {
			if (arr[i] > 128) {
				try {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
					if (temp != null) {
						pybf.append(temp[0].charAt(0));
					} else {
						pybf.append(arr[i]);
					}
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			}
		}
		return pybf.toString().replaceAll("\\W", "").trim();
	}

	
	/**
	 * 获取汉字全拼
	 * 
	 * @param chinese
	 * @return 例如 微信=weixin
	 * @author Wesley.Wei
	 * @date 2015年4月3日 上午9:49:58
	 */
	public static String getFullSpell(String chinese) {
		StringBuffer pybf = new StringBuffer();
		char[] arr = chinese.toCharArray();

		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);

		try {
			for (int i = 0; i < arr.length; i++) {
				if (arr[i] > 128) {
					pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
				} else {
					pybf.append(arr[i]);
				}
			}
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			e.printStackTrace();
		}
		return pybf.toString();
	}
	
	/**
	 * 设置一个常用的输出格式
	 */
	private static HanyuPinyinOutputFormat getDefaultOutputFormat() {
		HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
		format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 没有音调数字
		format.setVCharType(HanyuPinyinVCharType.WITH_V);// u显示
		return format;
	}

	/**
	 * 首字母转大写
	 */
	private static String upperCaseFirst(String s) {
		if (Character.isUpperCase(s.charAt(0))) {
			return s;
		} else {
			return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0)))
					.append(s.substring(1)).toString();
		}
	}

	/**
	 * 返回一个汉字的拼音，全部为小写无音调。如：绿（lv）
	 * 
	 * @param ch 汉字
	 * @return 拼音
	 * @author 何珏 2014-8-28
	 */
	public static String getCharPinyin(char ch) {
		HanyuPinyinOutputFormat format = getDefaultOutputFormat();

		String[] py = null;
		try {
			py = net.sourceforge.pinyin4j.PinyinHelper.toHanyuPinyinStringArray(ch, format);
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		// 当转换不是中文字符时,返回null
		return (py == null) ? null : py[0];
	}

	/**
	 * 获得一个汉语字符串的拼音，首字母大写，如：你好（NiHao）
	 * 
	 * @param chinese 汉语字符串
	 * @return 汉语拼音
	 * @author 何珏 2014-8-28
	 */
	public static String getPinyin(String chinese) {
		if (StringUtils.isBlank(chinese)) {
			return chinese;
		}

		StringBuilder pinyin = new StringBuilder();

		for (int i = 0; i < chinese.length(); ++i) {
			String py = getCharPinyin(chinese.charAt(i));

			// 当转换不是中文字符时,返回null
			if (py != null) {
				pinyin.append(upperCaseFirst(py));
			} else {
				pinyin.append(chinese.charAt(i));
			}
		}

		return pinyin.toString();
	}

	/**
	 * 获得一个汉字字符串的简拼，如：你好（NH）
	 * 
	 * @param chinese 汉语字符串
	 * @return 汉语拼音的大写首字母
	 * @author 何珏 2014-8-28
	 * 
	 */
	public static String getJianpin(String chinese) {
		if (StringUtils.isBlank(chinese)) {
			return chinese;
		}

		StringBuilder pinyin = new StringBuilder();

		for (int i = 0; i < chinese.length(); ++i) {
			String py = getCharPinyin(chinese.charAt(i));

			// 当转换不是中文字符时,返回null
			if (py != null) {
				pinyin.append(Character.toUpperCase(py.charAt(0)));
			} else {
				pinyin.append(chinese.charAt(i));
			}
		}

		return pinyin.toString();
	}

}
